package com.huika.huikalib.utils;

import android.util.Log;

import java.util.Locale;
import java.util.regex.Pattern;

/**
 * 字符串操作工具包<br>
 * <b>创建时间</b> 2014-8-14
 *
 * @version 1.1
 */
public class StringUtils {
    private final static Pattern emailer = Pattern.compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");
    private final static Pattern phone = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$");
    private final static Pattern taiPhone = Pattern.compile("0(6|8|9)[0-9]{8}");

    /**
     * 判断给定字符串是否空白串 空白串是指由空格、制表符、回车符、换行符组成的字符串 若输入字符串为null或空字符串，返回true
     */
    public static boolean isEmpty(CharSequence input) {
        if (input == null || "".equals(input)) return true;

        for (int i = 0; i < input.length(); i++) {
            char c = input.charAt(i);
            if (c != ' ' && c != '\t' && c != '\r' && c != '\n') {
                return false;
            }
        }
        return true;
    }

    /**
     * 判断是不是一个合法的电子邮件地址
     */
    public static boolean isEmail(CharSequence email) {
        if (isEmpty(email)) return false;
        return emailer.matcher(email).matches();
    }


    /**
     * 判断是不是一个合法的手机号码
     */
    public static boolean isPhone(CharSequence phoneNum) {
        if (isEmpty(phoneNum)) return false;
        return phone.matcher(phoneNum).matches();
    }

    /**
     * 判断是不是一个合法的泰国手机号码
     */
    public static boolean isTaiPhone(CharSequence phoneNum) {
        if (isEmpty(phoneNum)) return false;
        return taiPhone.matcher(phoneNum).matches();
    }

    /**
     * 字符串转整数
     *
     * @param str
     * @param defValue
     * @return
     */
    public static int toInt(String str, int defValue) {
        try {
            return Integer.parseInt(str);
        } catch (Exception e) {
        }
        return defValue;
    }

    /**
     * 对象转整
     *
     * @param obj
     * @return 转换异常返回 0
     */
    public static int toInt(Object obj) {
        if (obj == null) return 0;
        return toInt(obj.toString(), 0);
    }

    /**
     * String转long
     *
     * @param obj
     * @return 转换异常返回 0
     */
    public static long toLong(String obj) {
        try {
            return Long.parseLong(obj);
        } catch (Exception e) {
        }
        return 0;
    }

    /**
     * String转double
     *
     * @param obj
     * @return 转换异常返回 0
     */
    public static double toDouble(String obj) {
        try {
            return Double.parseDouble(obj);
        } catch (Exception e) {
        }
        return 0D;
    }

    /**
     * 字符串转布尔
     *
     * @param b
     * @return 转换异常返回 false
     */
    public static boolean toBool(String b) {
        try {
            return Boolean.parseBoolean(b);
        } catch (Exception e) {
        }
        return false;
    }

    /**
     * 判断一个字符串是不是数字
     */
    public static boolean isNumber(CharSequence str) {
        try {
            Integer.parseInt(str.toString());
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    /**
     * byte[]数组转换为16进制的字符串。
     *
     * @param data 要转换的字节数组。
     * @return 转换后的结果。
     */
    public static final String byteArrayToHexString(byte[] data) {
        StringBuilder sb = new StringBuilder(data.length * 2);
        for (byte b : data) {
            int v = b & 0xff;
            if (v < 16) {
                sb.append('0');
            }
            sb.append(Integer.toHexString(v));
        }
        return sb.toString().toUpperCase(Locale.getDefault());
    }

    /**
     * 16进制表示的字符串转换为字节数组。
     *
     * @param s 16进制表示的字符串
     * @return byte[] 字节数组
     */
    public static byte[] hexStringToByteArray(String s) {
        int len = s.length();
        byte[] d = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            // 两位一组，表示一个字节,把这样表示的16进制字符串，还原成一个进制字节
            d[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i + 1), 16));
        }
        return d;
    }

    /**
     * 泰国手机省略号（10位 06|08|09 开头）
     *
     * @param str
     * @return
     */
    public static String dealStrPhone(String str) {
        if (!isTaiPhone(str)) {
            return str;
        }
        StringBuilder sb = new StringBuilder();
        sb.append(str.substring(0, 3));
        for (int i = 3; i < str.length() - 3; i++) {
            sb.append("*");
        }
        sb.append(str.substring(str.length() - 3, str.length()));
        return sb.toString();
    }

    /**
     * 邮箱加删略号 aaa*@hk.com
     *
     * @param str
     * @return
     */
    public static String dealStrEmail(String str) {
        if (!isEmail(str)) {
            return str;
        }
        StringBuilder sb = new StringBuilder();
        String arr[] = str.split("@");
        int length = arr[0].length();
        int start = 3; //默认从第3位（包含第三个）
        if (length <= 3) {
            if (length == 1) {//如果账号长度 只有一个字符  (a*@hk.com)
                start = 1;
                length = 2; //手动在后面添加已个*
            } else {
                start = length - 1; //从倒数第二位开始 (a*@hk.com | aa*@hk.com)
            }
        }
        //aaa*@hk.com
        sb.append(arr[0].substring(0, start));
        for (int i = start; i < length; i++) {
            sb.append("*");
        }
        sb.append("@");
        sb.append(arr[1]);
        return sb.toString();
    }

    /**
     * 12位的话，444之间空格，即1234 5678  9876  ，如果是13位，就是544之间空格，即 X1234  5678  9876，
     *
     * @param srcStr
     * @return
     */
    public static String spaceFormatString(String srcStr) {
        StringBuilder sb = new StringBuilder();

        int size = ((srcStr.length()) % 4 == 0) ? ((srcStr.length()) / 4) : ((srcStr.length()) / 4 + 1);
        int endIndex2 = 0;
        for (int i = 0; i < size; i++) {
            if (srcStr.length() % 2 == 0) {
                int endIndex = (i + 1) * 4;
                if (i + 1 == size) {
                    endIndex = srcStr.length();
                }
                if (i == 0) {
                    sb.append(srcStr.substring(i, endIndex));
                } else {
                    sb.append(" ");
                    sb.append(srcStr.substring(i * 4, endIndex));
                }
            } else {
                if (i != 0) {
                    endIndex2 += 4;
                    if (i + 1 == size) {
                        endIndex2 = srcStr.length();
                    }
                    sb.append(" ");
                    sb.append(srcStr.substring(i * 4 + 1, endIndex2));
                } else {
                    endIndex2 += 5;
                    sb.append(srcStr.substring(i, endIndex2));
                }
            }
        }
        return sb.toString();
    }

    /**
     * @param 10位 或 9 位泰国电话号码
     * @return
     */
    public static String formatTaiPhone(String taiPhone) {
        if (isEmpty(taiPhone)) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        //10位的手机号码 //068-888-8888
        if (taiPhone.length() == 10) {
            sb.append(taiPhone.substring(0, 3));
            sb.append("-");
            sb.append(taiPhone.substring(3, 6));
            sb.append("-");
            sb.append(taiPhone.substring(6));
        } else if (taiPhone.length() == 9) {
            //9位座机号码 //02-888-8888
            sb.append(taiPhone.substring(0, 2));
            sb.append("-");
            sb.append(taiPhone.substring(2, 5));
            sb.append("-");
            sb.append(taiPhone.substring(5));
        } else {
            sb.append(taiPhone);
        }
        return sb.toString();
    }

}
